package acl


// ACL 表示内存中的 IP 白名单集合（当前仅支持精确匹配）
// 空集合 = 全放行，后续可替换为编译式规则引擎。
type ACL struct {
	set      map[string]struct{} //就是白名单ip
	// allowAll bool                //是否允许全部
}

// Allow 判断 IP 是否允许访问；第二个返回值为动作语义字符串。
// (a *ACL) 就是this指针
func (a *ACL) Allow(ip string) (bool) {
	if ip == "" {
		return false //拒绝
	}

	// if a.allowAll {
	// 	return true, "permit"
	// }

	if _, ok := a.set[ip]; ok { //不是this.set 而是a.set
		return true
	}
	return false
}

// New 根据字符串切片构建内存白名单；空列表表示允许全部。
//已知白名单数组
func NewACL(ips []string) *ACL {
	if len(ips) == 0 {
		return &ACL{}
	}
	m := make(map[string]struct{}, len(ips))
	for _, ip := range ips {
		if ip != "" {
			m[ip] = struct{}{}
		}
	}
	return &ACL{set: m}
}

//全局接口提供白名单
func GetWhiteList()[]string{
	//1.从数据库中获取
	//2.内存中获取
	///////////从管理端获取的ip多种格式的数组///////

	//
	return  []string{"172.17.176.1","192.168.10.1/24","192.168.1.1-192.168.2.2"}
}